////////////////////////////////////////////////////////////////////////
// Last svn revision: $Id:  $ 
////////////////////////////////////////////////////////////////////////
/// \class drow::MLC::ComplexOp
///
/// \brief The static methods for operating on Complex numbers
///
/// \author Olivia Waslski         <oliviawasalski@gmail.com>
///
/// REVISION HISTORY:\n
/// 	22/03/12 : Olivia Wasalski - New File \n
///
/// \details The static operator overloads, methods, and so on for Complex numbers
///
////////////////////////////////////////////////////////////////////////

#ifndef __drow_MLC_ComplexOp__
#define __drow_MLC_ComplexOp__

#include "MLC/AComplexOp.hh"

namespace drow {
namespace MLC {
    class Complex;
    
//This variable is assigned by the user to determine which set of
//functions the Complex operations should use.
static AComplexOp* complexOp;

// All of these functions need to be implemented in the header file
// because static global methods need to be implemented where it is
// declared
static Complex Conjugate( const Complex& a ) {
    return complexOp->ComplexConjugate(a);
}

static Complex Add( const Complex& a, const Complex& b ) {
    return complexOp->Add(a,b);
}

static Complex operator+( const Complex& a, const Complex& b ) {
    return Add(a,b);
}

static Complex Subtract( const Complex& a, const Complex& b ) {
    return complexOp->Subtract(a,b);
}

static Complex operator-( const Complex& a, const Complex& b ) {
    return Subtract(a,b);
}

static Complex Multiply( const Complex& a, const Complex& b ) {
    return complexOp->Multiply(a,b);
}

static Complex operator*( const Complex& a, const Complex& b ) {
    return Multiply(a,b);
}

static double MagnitudeSquared( const Complex& a ) {
    return complexOp->MagnitudeSquared(a);
}

static double Magnitude( const Complex& a ) {
    return complexOp->Magnitude(a);
}

static double Angle( const Complex& a ) {
    return complexOp->Angle(a);
}

} // namespace MLC
} // namespace drow

#endif
